#!/usr/bin/env sh
# generate b64 binary with sh script 
#   shellcheck -s sh

# install instruction:
# ./mk > b64
COPY_START_FROM_NEXT_LINE="

echo \"==   paste input, use ctrl-c as endmark  ==\";cat > mk

#COPY_END
"

DEBUG=0

binary_table="'000000' '000001' '000010' '000011' '000100' '000101' '000110' '000111' \
              '001000' '001001' '001010' '001011' '001100' '001101' '001110' '001111' \
              '010000' '010001' '010010' '010011' '010100' '010101' '010110' '010111' \
              '011000' '011001' '011010' '011011' '011100' '011101' '011110' '011111' \
              '100000' '100001' '100010' '100011' '100100' '100101' '100110' '100111' \
              '101000' '101001' '101010' '101011' '101100' '101101' '101110' '101111' \
              '110000' '110001' '110010' '110011' '110100' '110101' '110110' '110111' \
              '111000' '111001' '111010' '111011' '111100' '111101' '111110' '111111'"
i=0
for x in $binary_table; do
    eval binary_table$i=$x
    i=$((i+1))
done

# A neat feature of shell arrays is that they are sparse, and we leverage that here.
# This builds a mapping between the ASCII code of the base64 string characters and
# the corresponding offset in the binary_table above.
# 0-25
ascii_table1="0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25" 
# 26-51			  
ascii_table2="26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51"
# 52-61			  
ascii_table3="52 53 54 55 56 57 58 59 60 61"
i=65
for x in $ascii_table1; do
	# A-Z
    eval ascii_map$i=$x
    i=$((i+1))
done
j=97	
for x in $ascii_table2; do
	# a-z
    eval ascii_map$j=$x
    j=$((j+1))
done
k=48
for x in $ascii_table3; do
	# 1-9
    eval ascii_map$k=$x
    k=$((k+1))
done

# +
ascii_map43=62
# /
ascii_map47=63

input_file=$1
# The string passed will be a binary representation of at most 3 bytes.
print_binary() {
  bytes=$1
  [ $DEBUG -eq 1 ] && echo "   bytes= "$bytes
  # pad out to the nearest byte
  while [ $((${#bytes} % 8)) -gt 0 ]; do
    bytes="${bytes}0"
  done
  num_bytes=$((${#bytes} / 8))
  # split string into 8-bit substrings
  counter=0
  while [ ${#bytes} -gt 0 ]; do    
    next=${bytes#?}
    letter=${bytes%"$next"}
    bytes=$next
  
    # parse binary string into an integer representation
    bit_counter=$((counter % 8 ))
    [ $bit_counter -eq 0 ] && byte=0
    if [ $bit_counter -lt 8 ]; then
      to_shift=$((7 - $bit_counter))
      bit=$(($letter << $to_shift))
      byte=$(($byte + $bit))
      counter=$((counter+1))
    fi
    if [ $bit_counter -eq 7 ]; then
      # once we have the byte decoded, print it to stdout
      #printf "\x$(printf '%02x' $byte)"
      byte1=$(printf '%o' $byte)
      #echo $byte1
      # Convert to pure binary
      printf '%b' \\"$byte1"
    fi 
  done
}


count=0
binary_string=''
# BUG: The input file must contain at least one newline or else this no-ops
# BUG: This will produce faulty output if the lines on the inputfile are not a multiple of 4 in length
# read each line
START_FOUND=0
while read -r word; do
 [ $DEBUG -eq 1 ] && echo "word= "$word 
 if [ $START_FOUND -eq 1 ]; then
  while [ ${#word} -gt 0 ]; do    
    # get the base64-encoded letter
    next=${word#?}
    letter=${word%"$next"}
    word=$next
    [ $DEBUG -eq 1 ] && echo "  letter= "$letter
    # turn it into an ASCII code
    ascii_code=$(printf '%d' "'${letter}")
    [ $DEBUG -eq 1 ] && echo "ascii_code = "$ascii_code
    # look up in our table to see the binary snippet that corresponds with it
    binary_table_idx=$(eval echo '$'ascii_map$ascii_code)
    [ $DEBUG -eq 1 ] && echo "binary_table_idx = "$binary_table_idx

    # if the file has an invalid base64 character we just skip it
    if [ -n "$binary_table_idx" ]; then
      binary_string="${binary_string}$(eval echo '$'binary_table$binary_table_idx)"
      count=$(($count + 1))
      if [ $((count % 4)) -eq 0 ]; then
        [ $DEBUG -eq 1 ] && echo
        print_binary $binary_string
        binary_string=''
      fi
    fi
    [ $DEBUG -eq 1 ] &&  echo "loop word= "$word
  done
 fi
 [ X"$word" = X"==START==" ] && START_FOUND=1
done < "$0"
# Since '=' is ignored in the above loop, we need to handle the case where there's
# trailing padding. 
if [ -n "$binary_string" ]; then
  print_binary $binary_string
fi

exit 0







==START==
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
Qf/TEckB23UIix5Ig+78Edtz7UiB/QDz//8Rwegx////64NZSInwSCnIWkgp11mJOVtdw2geAAAA
Wui9AAAAUFJPVF9FWEVDfFBST1RfV1JJVEUgZmFpbGVkLgoACgAkSW5mbzogVGhpcyBmaWxlIGlz
IHBhY2tlZCB3aXRoIHRoZSBVUFggZXhlY3V0YWJsZSBwYWNrZXIgaHR0cDovL3VweC5zZi5uZXQg
JAoAJElkOiBVUFggMy45MSBDb3B5cmlnaHQgKEMpIDE5OTYtMjAxMyB0aGUgVVBYIFRlYW0uIEFs
bCBSaWdodHMgUmVzZXJ2ZWQuICQKAJCQXmoCX2oBWA8Fan9fajxYDwVbagFoDABAAFBoJCMhAFFB
V78AAIAAagdaviQjIQBqMkFaRSnAaglYDwU5xw+F9f7//74AAEAAifop8nQVAdUBVCQIAVQkGInZ
KfHB6QP880ill0iJ3lCSrVBIieGtl61ED7bASIf+/9VZw11IjUX3RIs4usgAAABMKfhBKddIjQwQ
6Hn///9yBgAAbAUAAAJJAwD+///l6F8AL3Byb2Mvc2VsZi9leGUAg/lJdUpIifH////fAv7rLIoH
SIPHATyAcgo8j3cGgH/+D3QGLOg8AXe7/dv/IzgXdR+LByUA/wAPyCn4AfCrKekEL/727z9I/8l1
2esFBr7DQVlJ5kiNvvDv3W7/1ikJ/GoHWfNIpSU+AAV1+O9mh70Q+kirDFcICvZMjX/v2m93Gzq4
IAA9q7oAEKWOTInPan////9ZWA8FhcB4BMYEBgBJg8EPWV5fSIHsAAgg4kmJ3862/ehqAOhhBAxa
FMQdWVnB4d3+//8MSAHPKc5QagtYQf8nsAvrDbAK6wmwDKGwCd9u374yyg+2wFNIPQDwn3IEgsj/
w7Bv////AOvqsALr5rAD6+KwPOveAFFIORdMi0cIxkr/c+03t+EKv3816OP5Lfn/dBFBQbft7bsA
60n/wIgGB8br6W5XKikXu93etlj7VV/VQVQEzFWe/VMD39zfW/qD7CjmD4TiRE90JBC637bdvwwJ
ie/ollGLVBCLFBSF0nXfdbf/FYH+VVBYIXURL30AMLEm6wSF9nXb/91ggGIuOdZ38onQSDsDd+sK
SG/drf2LQwhzaIlB74t9q0wIRItE7S5s2yQYW8L31TV1x1kMO9v/W9tydb2yHRmEyQ+VwjHATYXk
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
CAAArwIAAEg5AABJAwB4vAAAAA==
